#!/usr/bin/env node
'use strict';

const fs = require('fs');
const path = require('path');
const readline = require('readline');
const { execSync } = require('child_process');

// 创建命令行接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// 提示用户输入
function prompt(question) {
  return new Promise((resolve) => {
    rl.question(question, (answer) => {
      resolve(answer.trim());
    });
  });
}

// 字段类型映射
const fieldTypes = {
  '1': 'STRING',
  '2': 'INTEGER', 
  '3': 'TEXT',
  '4': 'BOOLEAN',
  '5': 'DATE',
  '6': 'FLOAT',
  '7': 'DECIMAL'
};

// 主函数
async function main() {
  console.log('🚀 Egg.js 实体生成器');
  console.log('===================');
  
  try {
    // 获取实体名称
    const name = await prompt('请输入实体名称 (例如: user, product): ');
    if (!name) {
      console.log('❌ 实体名称不能为空');
      process.exit(1);
    }

    // 获取中文描述
    const cname = await prompt('请输入中文描述 (例如: 用户表): ');

    // 获取字段信息
    console.log('\n📝 添加字段 (输入 done 完成):');
    console.log('字段类型: 1-STRING, 2-INTEGER, 3-TEXT, 4-BOOLEAN, 5-DATE, 6-FLOAT, 7-DECIMAL');
    
    const fields = [];
    
    while (true) {
      const fieldName = await prompt('\n字段名称 (或输入 done 完成): ');
      if (fieldName.toLowerCase() === 'done') break;
      
      if (!fieldName) continue;

      console.log('字段类型选项:');
      Object.entries(fieldTypes).forEach(([key, value]) => {
        console.log(`  ${key} - ${value}`);
      });
      
      const typeChoice = await prompt('选择字段类型 (1-7): ');
      const type = fieldTypes[typeChoice] || 'STRING';
      
      const length = await prompt('字段长度 (可选，直接回车跳过): ');
      const required = await prompt('是否必填? (y/n, 默认n): ');
      const description = await prompt('字段描述: ');
      const comment = await prompt('数据库注释: ');

      // 询问是否为外键
      const isForeignKey = await prompt('是否为外键? (y/n, 默认n): ');

      const field = {
        name: fieldName,
        type: type,
        required: required.toLowerCase() === 'y',
        description: description || fieldName,
        comment: comment || fieldName,
        allowNull: required.toLowerCase() !== 'y'
      };

      if (length) {
        field.length = isNaN(length) ? length : parseInt(length);
      }

      // 如果是外键，添加外键配置
      if (isForeignKey.toLowerCase() === 'y') {
        const refModel = await prompt('关联的表名 (例如: users): ');
        const refKey = await prompt('关联的字段名 (默认: id): ') || 'id';
        const onUpdate = await prompt('更新约束 (CASCADE/RESTRICT/SET NULL/SET DEFAULT/NO ACTION, 默认: CASCADE): ') || 'CASCADE';
        const onDelete = await prompt('删除约束 (CASCADE/RESTRICT/SET NULL/SET DEFAULT/NO ACTION, 默认: CASCADE): ') || 'CASCADE';

        if (refModel) {
          field.references = {
            model: refModel,
            key: refKey
          };
          field.onUpdate = onUpdate;
          field.onDelete = onDelete;
        }
      }

      // 询问其他属性
      const hasDefault = await prompt('是否有默认值? (y/n, 默认n): ');
      if (hasDefault.toLowerCase() === 'y') {
        const defaultValue = await prompt('默认值: ');
        if (defaultValue) {
          field.defaultValue = defaultValue;
        }
      }

      const isUnique = await prompt('是否唯一? (y/n, 默认n): ');
      if (isUnique.toLowerCase() === 'y') {
        field.unique = true;
      }

      fields.push(field);
      console.log(`✅ 已添加字段: ${fieldName} (${type})`);
    }

    // 生成配置对象
    const config = {
      name: name,
      cname: cname || `${name}表`,
      fields: fields,
      fields_option: {},
      createTable_option: {}
    };

    // 临时保存当前配置
    const configPath = path.join(__dirname, 'config.js');
    const originalConfig = require('./config.js');

    // 写入新配置
    const configContent = `'use strict';\nmodule.exports = ${JSON.stringify(config, null, 2)};`;
    fs.writeFileSync(configPath, configContent);

    console.log('\n🔄 正在生成文件...');

    try {
      // 使用子进程执行生成器，避免模块缓存问题
      execSync('node generator/index.js', {
        cwd: path.join(__dirname, '..'),
        stdio: 'inherit'
      });
    } catch (error) {
      console.error('❌ 生成过程中出现错误:', error.message);
      throw error;
    }
    
    console.log('\n✅ 生成完成！');
    console.log(`📁 生成的文件:`);
    console.log(`   - app/model/${name}s.js`);
    console.log(`   - app/controller/v1/${name}s.js`);
    console.log(`   - app/service/${name}s.js`);
    console.log(`   - app/contract/${name}s.js`);
    console.log(`   - test/app/controller/${name}s.test.js`);
    
    // 恢复原配置（可选）
    const restoreOriginal = await prompt('\n是否恢复原配置文件? (y/n, 默认n): ');
    if (restoreOriginal.toLowerCase() === 'y') {
      const originalContent = `'use strict';\nmodule.exports = ${JSON.stringify(originalConfig, null, 2)};`;
      fs.writeFileSync(path.join(__dirname, 'config.js'), originalContent);
      console.log('✅ 已恢复原配置文件');
    }

  } catch (error) {
    console.error('❌ 生成失败:', error.message);
  } finally {
    rl.close();
  }
}

// 如果直接运行此文件
if (require.main === module) {
  main();
}

module.exports = main;
